package cn.tdeu.v3_1;

import java.io.*;
import java.net.*;
import java.util.*;

/**
 *Server 端--流置空  升级 JavaOOP 私有化属性
 *
 */
public class Server {
    private ServerSocket serverSocket;
    private String ip;  //String  ip=null;   申请端口--没有IP
    private static Integer PORT=3678;
    public Server(){
        try {
            serverSocket=new ServerSocket(PORT);
        } catch (BindException e){
            System.out.println("请检查端口号，被占用~");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void start() {
        try {
            while(true) {
                System.out.println("等待客户端连接");

                new Thread(new ClientHandler(serverSocket.accept())).start();
            }
        } catch (IOException e) {
            System.out.println(ip+"客户端链接断开链接~");
        } finally {
            if(serverSocket!=null&&!serverSocket.isClosed()){
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    System.out.println("服务器关闭失败~~~");
                }
                System.out.println("服务器关闭成功~~Over");
            }
        }
    }
    public static void main(String[] args){
        Server server=new Server();
        server.start();
    }
    //ClientHandler
    private class ClientHandler implements Runnable {
        private Socket socket;

        //Server  ---CS类   ---输入 输出 流 关闭
        //Client  ---start()---输入 输出 流 关闭
        private PrintWriter pw;
        private BufferedReader br;

        public ClientHandler(Socket s) {
            //1.明确接入客户端 通讯类 Socket
            this.socket =s;
            //2.给明确接入客户端，IP地址
            ip = socket.getInetAddress().getHostAddress();
            //3.给明确接入客户端，读写功能
            try {
                br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF8"));
                pw=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),"UTF8")),true);
            } catch (IOException e) {
                System.out.println("客户端断开链接了~");
            }
        }

        public void run() {

            //   BufferedReader br = null;
            try {


                new Thread(()->{
                    try {
                        String message;
                        while ((message=br.readLine())!=null) {//读入客户端
                            System.out.println(message);
                            //1.6 增加一句话--每次客户端发给服务器内容
                            System.out.print("服务器请输入：");
                        }
                    } catch (IOException e) {
                        System.out.println("客户端发来的消息断开了~");
                    }
                }).start();
                Scanner input=new Scanner(System.in);
                while(true){
                    System.out.println("服务器请输入：");
                    String sme=input.nextLine();
                    pw.println("服务器说："+sme);
                }
            } finally {
                if (pw!=null)
                    pw.close();
                if (br != null)
                    try {
                        br.close();
                    } catch (IOException e) {
                        System.out.println("读入流断开链接~");
                    }
                if(socket!=null&&!socket.isClosed()){
                    System.out.println(ip+"客户端退出服务器链接~");
                    try {
                        socket.close();
                    } catch (IOException e) {
                        System.out.println(ip+"客户端退出链接异常~");
                    }
                }
            }
        }
    }
}

